using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using App.Modelo;
using App.Modelo.Interfaces;
using StringConverter = System.ComponentModel.StringConverter;

namespace App.SolInf.Modelo
{
    public class Presupuesto : INotifyPropertyChanged
    {
        private Cliente cliente;

        public virtual Int32 Id { get; set; }

        public virtual Cliente Cliente
        {
            get { return cliente; }
            set
            {
                cliente = value;
                _propertyChanged("Cliente");
            }
        }

        [TypeConverter(typeof(StringConverter))]
        public virtual IUsuario Vendedor { get; set; }
        public virtual DateTime? FechaAlta { get; set; }
        public virtual DateTime? FechaVencimiento { get; set; }

        public virtual EstadoPresupuesto Estado { get; set; }
        public virtual FormaPago FormaPago { get; set; }
        public virtual String Comentario { get; set; } 
        

        public virtual IList<LineaPresupuesto> LineasPresupuesto { get; set; }

        /// <summary>
        /// Calcula el total del presupuesto
        /// </summary>
        public virtual Double Total
        {
            get { return Math.Round(LineasPresupuesto.Sum(linea => linea.Subtotal), 2); }
        }

        public Presupuesto()
            : base()
        {
            Estado = EstadoPresupuesto.Nuevo;
            LineasPresupuesto = new List<LineaPresupuesto>();
        }

        
        public virtual event PropertyChangedEventHandler PropertyChanged;

        public virtual void ActualizarSubtotal()
        {
            _propertyChanged("Total");
        }

        public virtual bool EstaVigente
        {
            get { return FechaVencimiento > DateTime.Now; }
        }

        private void _propertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }

    }
}